/* 
 * File:   Automata.h
 * Author: Dianita
 *
 * Created on 2 de noviembre de 2013, 03:58 PM
 */

#ifndef AUTOMATA_H
#define	AUTOMATA_H
#include <list>
#include "Estado.h"
#include "Letra.h"
#include "Transicion.h"

class Automata {
public:
    Automata();
    //SET Y GET DE LOS ATRIBUTOS
    void setListaEstados(list<Estado> estados);
    list<Estado> getListaEstados();
    
    void setEstadoInicial(Estado estadoInicial);
    Estado getEstadoInicial();
    
    void setListaEstadosFinales(list<Estado> estadosFinales);
    list<Estado> getListaEstadosFinales();
    
    void setAlfabeto(list<Letra> alfabeto);
    list<Letra> getAlfabeto();
    
    void setTransiciones(list<Transicion> transiciones);
    list<Transicion> getTransiciones();
    
    //MÉTODOS DE CLASE
    
    //BUSCA SI TODOS LOS CARACTERES DE LA CADENA INGRESADA PERTENECEN AL ALFABETO 
    bool perteneceAlfabeto(string cadena, list<Letra> alfabeto);
    //BUSCA LA TRANSICION INICIAL EN LA TABLA DE TRANSICIONES DADO UN ESTADO Y UNA LETRA 
    Estado pasarTransicion(list<Transicion> transiciones,  string letra);
    //BUSCA TRANSICIONES DADO UN ESTADO
    list<Transicion> buscaTransiciones(list<Transicion> transiciones, Estado estado);
    
    void correrAutomata(string cadena);
    void correrAutomataPalabras(list<string> palabras);
    bool esCadenaAceptada(Estado ultimoEstado);
    
    list<Letra> generarAlfabeto(list<string> palabras);
    bool buscaLetras(string caracter, list<Letra> letras);
    void imprimirAlfabeto(list<Letra> alfabeto);
    
private:
    std::list<Estado> listaEstados;
    Estado estadoInicial;
    std::list<Estado> listaEstadosFinales;
    std::list<Letra> alfabeto;
    std::list<Transicion> transiciones;
};

#endif	/* AUTOMATA_H */

